闲话 22.9.23

闲话

预告一下
继FFT FWT FMT后又出现了FDT(F的T)
Zhou 喜欢在有着秋日气氛的校园里面散步
Cdsidi喜欢吃七分饱而且巨所以管子炸了
不知道说什么东西

不知道我在说什么?你很快就会知道的

昨天jjdw的歌词是LostOne的号哭
想唱但是脑子里只有mafu的不知道是什么的歌 似乎是《空腹》
今天jjdw的(没有)歌词是Merry Bad End
是mafu的歌但是没歌词所以一句都想不出来

但是《空腹》很会唱(
虽然唱不上去就是了

今天是饭的图!

旅 - 其四

image

比较大所以这个是小一点(一半)的

点我!

因为被AT题干掉了
于是在找构造题练手
在洛咕上搜构造标签
于是给了我一道题
P4689 [Ynoi2016] 这是我自己的发明
啊对对对

几天来随便切了几道题

因为jjdw写了所以我写一下
其实没什么难的题 要么一眼出性质要么两眼出结果
所以意识流一下 看不懂见谅

没有代码。

[YER 2021] TEST_68

给定一棵 n 个节点的树,第 i 个点有一个权值 ai

对每个点 x,其的答案为其所在子树外的所有点中,选两个可以相同的点 i,jai 异或 aj 的最大值,如果选不出两个点,则认为 x 的答案是 0

1n5×1050ai1018

第一眼Trie。考虑怎么维护求值。

这题唯一的性质就是“子树外”三个字。从这上面下手。
叶子节点显然除了自己都能选。然后外推性质发现最终似乎有很多点的答案都是相同的。
设树上任意两点的 xor 最大值出现在 a[p]a[q]。根据性质似乎有 pq 到根的路径上外的所有点答案都是 a[p]a[q] 。这样问题就被解决大半了。这部分答案可以直接上Trie板子。

然后考虑怎么求出 pq 到根的路径上点的答案。两边的路径除了LCA外是不相关的,可以求两次。因此在特判LCA的情况下可以拆成两条链求解。
对于一条根到目标节点的链,我们从根开始往下扫,扫到一个节点先把不含目标节点的子树中的值加入Trie,这棵Trie里的 xor 最大值就是这个点的答案。然后把这个点加入 Trie,接着扫。

总时间复杂度是三次插入+查询每个节点。因此是 O(nlog) 的。

简单题

T 组询问。一开始给定一个常数 K。每次询问单独给定 n。请你求出:

i=1nj=1n(i+j)Kgcd(i,j)μ2(gcd(i,j))(mod232)

T=104, n\le 10^7,1K<231

化式子题。也不太难,是不同于幽灵乐团的做法。

i=1nj=1n(i+j)Kgcd(i,j)μ2(gcd(i,j))= x=1i=1nj=1n(i+j)Kxμ2(x)[gcd(i,j)=x]= x=1xμ2(x)d=1μ(d)(xd)Ki=1n/xdj=1n/xd(i+j)K= T=1d|Tμ2(d)μ(Td)dTKi=1n/Tj=1n/T(i+j)K

S(n)=i=1nj=1n(i+j)KG(n)=i=1niKf(T)=d|Tμ2(d)dμ(Td)
则原式变为

T=1S(nT)f(T)Tk

这个一眼整除分块。然后考虑预处理 f 的前缀和以及快速处理 S 的单点。

S(n)=i=1nj=1n(i+j)K=i=n+12nj=1ijKi=1nj=1ijK=G(2n)2G(n)

证明考虑竖着求和变横着求和。然后自然数幂是完全积性的 idK,可以直接筛,这样我们就解决完两个东西了,剩一个 f

简单推一下 f 的筛法。f 在质数处的取值显然 p1,接下来是筛的部分。

pnf(pn)=d|nμ2(d)dμ(pnd)+μ2(pd)pdμ(nd)=d|nμ2(d)dμ(nd)+μ2(d)pdμ(nd)=(p1)f(n)

pn  p2nf(pn)=d|npμ2(d)dμ(pnd)+μ2(pd)pdμ(nd)+μ2(p2d)p2dμ(npd)=d|npμ2(pd)pdμ(nd)=pd|npμ2(d)dμ(npd)=p×f(np)

p2n  p3nf(pn)=d|npμ2(d)dμ(pnd)+μ2(pd)pdμ(nd)+μ2(p2d)p2dμ(npd)+μ2(p3d)p3dμ(np2d)=()×0

筛就完了。然后没了。

[NOIP2015] 充满了希望

给一个长为 n 的序列,有 m 个操作,操作编号从 1m,每个操作为:

1 x y:将序列位置为 x,y 的两个元素交换。

2 l r x:将序列区间 [l,r] 内所有元素修改为 x

3 x:查询序列 x 位置的值。

现在有 q 次查询,每次查询给出一个操作的区间 [l,r]

先将序列中的元素全部置为 0,之后依次进行从 lr 的所有操作,求出所有这些操作中所有 3 操作的答案的和。

查询之间独立。

1n,m,q1061x109

一眼被吓到。第二眼发现这玩意是求和。然后就好搞了。

容易发现所有查询查出来的要么是2操作改的值,要么是0。
考虑先预处理出每次操作的值。

我们整来一棵线段树,叶子维护元素最新一次修改对应的修改操作编号,然后顺序扫每个操作。如果是1就把树上x和y叶子节点的编号swap,2就区间覆盖这个操作,3就把当前x的编号记录下来。

对于查询,我们离线下来做扫描线,过程中用BIT维护当前操作集合
经典地,在r位置记录一个l,然后顺序扫每个操作。对于3操作,把BIT里记录的编号位置加一个编号对应操作的x值,其他操作不管。操作完扫当前位置的查询,查一下BIT里l-r区间内的和就是最终答案。

看上去很离谱但是比较套路。

异或粽子

给定一个长度为 n 的数组 ai ,你每次可以选择一个区间 [l,r] ,其价值为 val[l,r]=i=lrai。求价值最大的 k 个不同区间的价值和。

1n5×105,1kmin{n(n1)2,2×105},0ai2321

比较套路?这题应该也比较经典了。
上来求一个 xor 前缀和 si=i=1rai,然后问题转化成从 s0n 里选出 k 对来 xor 的最大值。

不想去重,因此乘2直接扫,最后答案除以2就行了。把所有值插入一个 Trie,然后就能快速找到和数 a xor 的第 k 大值了。

产生当前最大值的方式也很套路。我们把与每个 si xor 得到的第一大值插入一个大根堆,然后每次取堆顶累加入答案,若当前取出了与 si xor 的第 k 大值,那将与 si xor 的第 k+1 大值插入堆即可。
若我们需要前 k 大值,那迭代 k 轮后就是答案。

这题的 k 可以拓展到 O(n2) 的级别。现在查询的方式是确定 xor 的对象来搞的,我们也可以直接在 Trie 上二分,先查出第 k 大,再求出前 k 大。具体看这篇

好少好少好少jjdw牛的

posted @   joke3579  阅读(87)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示